import java.util.ArrayList;

/** 
* Ezen osztaly felelos a szomszedos  cellakkal valo kapcsolattartasert.
* Tartalmaz egy CellaElem tipusu attributumot is, amiben a rajta levo CellaElem tipusu objektumot tarolja.
*/




public class Cella
{
	private Cella felso;
	private Cella also;
	private Cella balfelso;
	private Cella balalso;
    private Cella jobbfelso;
    private Cella jobbalso;
    
    
    public CellaElem cellabanLevo;
    
    public Cella() {
    	this.cellabanLevo = null;
    	Szkeleton.Message("Cella letrejott..");
    }
    
    public Cella(CellaElem c) {
    	this.cellabanLevo = c;
    	Szkeleton.Message("Cella letrejott..");
    	c.setMezo(this);
    }
    
  //Szomszedos cellak beallitasa
    public void setFelso(Cella f) {
    	Szkeleton.Start("Cella", "setFelso");
    	this.felso = f;
    	Szkeleton.Finish("Cella", "setFelso");
    }
    
    public void setAlso(Cella a) {
    	Szkeleton.Start("Cella", "setAlso");
    	this.also = a;
    	Szkeleton.Finish("Cella", "setAlso");
    }
    
    public void setBalFelso(Cella b) {
    	Szkeleton.Start("Cella", "setBal");
    	this.balfelso = b;
    	Szkeleton.Finish("Cella", "setBal");
    }
    
    public void setBalAlso(Cella b) {
    	Szkeleton.Start("Cella", "setBal");
    	this.balalso = b;
    	Szkeleton.Finish("Cella", "setBal");
    }
    
    public void setJobbFelso(Cella j) {
    	Szkeleton.Start("Cella", "setJobb");
    	this.jobbfelso = j;
    	Szkeleton.Finish("Cella", "setJobb");
    }
    
    public void setJobbAlso(Cella j) {
    	Szkeleton.Start("Cella", "setJobb");
    	this.jobbalso = j;
    	Szkeleton.Finish("Cella", "setJobb");
    }
    
   
    
    
    /**
	* Olyan fuggveny mely CellaElem tipusu ertekkel ter vissza.  Megmondja, hogy az adott  cellaban milyen tipusu objektumot tarolunk.
	*
	* @return CellaElem
	*/
	public CellaElem getCellaElem()
    {
		Szkeleton.Start("CellaElem", "getCellaElem");
		Szkeleton.Finish("CellaElem", "getCellaElem");
		return cellabanLevo;
    }
	
	public void setCellaElem(CellaElem c)
	{
		this.cellabanLevo = c;
	}
	
    /**
	* Az adott Cellaba odalephet-e a CellaElem.
	*
	* @return boolean
	* @param x
	*/
    public boolean odaLephet(CellaElem x)
    {
    	boolean b;
    	Szkeleton.Start("Cella", "odalephet");
    	if(this.cellabanLevo == null) {
		Szkeleton.Finish("Cella", "odalephet");
    		return true;
    	}
    	else {
    		b = this.cellabanLevo.ralephete(x);
    		x.ralephete(cellabanLevo);
    		
    	}
    	Szkeleton.Finish("Cella", "odalephet");
    	return b;
    }
	
    /**
	* Az adott Cellaba betolti a megfelelo CellaElemet.
	*
	* @param x
	*/
    public void odaLep(CellaElem x)
    {
    
    }
	
    public ArrayList getSzomszed()
    {
    	ArrayList list = new ArrayList();
    	list.add(this.felso);
    	list.add(this.also);
    	list.add(this.balfelso);
    	list.add(this.balalso);
    	list.add(this.jobbfelso);
    	list.add(this.jobbalso);
    	
    	return list;
    }
	
    /**
	* Orautes hatasara bekovetkezo esemeny. Tovabb hiv a tartalmazott CellaElem-re.
	*/
    public void Lekerdez()
    {
    	Szkeleton.Start("Cella", "Lekerdez");
    	if(cellabanLevo != null) {
    		int irany = this.cellabanLevo.getKovetkezoLepes();
    		switch(irany) {
    		case Lepes.FELFELE: if(this.felso.odaLephet(cellabanLevo)) {
            				     this.felso.odaLep(cellabanLevo);
		  						}
    							cellabanLevo.kovetkezoLepes = -1;
    							break;
    		case Lepes.LEFELE: if(this.also.odaLephet(cellabanLevo)) {
									this.also.odaLep(cellabanLevo);
			   					}
    							cellabanLevo.kovetkezoLepes = -1;
    							break;
    		case Lepes.JOBBRAFEL: if(this.jobbfelso.odaLephet(cellabanLevo)) {
            						this.jobbfelso.odaLep(cellabanLevo);
		  				    	}
    							cellabanLevo.kovetkezoLepes = -1;
    							break;
    		case Lepes.JOBBRALE: if(this.jobbalso.odaLephet(cellabanLevo)) {
									this.jobbalso.odaLep(cellabanLevo);
			    				}
    							cellabanLevo.kovetkezoLepes = -1;
    							break;
    		case Lepes.BALRAFEL: if(this.balfelso.odaLephet(cellabanLevo)) {
                					this.balfelso.odaLep(cellabanLevo);
			  					}
    							cellabanLevo.kovetkezoLepes = -1;
    							break;
    		case Lepes.BALRALE: if(this.balalso.odaLephet(cellabanLevo)) {
									this.balalso.odaLep(cellabanLevo);
								}
    							cellabanLevo.kovetkezoLepes = -1;
    							break;
    		case Lepes.GORDUL: if(this.also.cellabanLevo == null) {
    							this.also.odaLep(cellabanLevo);
    							break;
    						   }
    						   if(this.balalso.cellabanLevo == null) {
    						    this.balalso.odaLep(cellabanLevo);
    							break;   
    						   }
    						   if(this.jobbalso.cellabanLevo == null) {
    							this.jobbalso.odaLep(cellabanLevo);
    							break;
    						   }
    						   break;
    		case Lepes.LERAK: int i = this.cellabanLevo.getIrany();
    						  CellaElem c = this.cellabanLevo.getLerak();
    						  switch(i) {
    						  case Lepes.FELFELE: if(this.felso.cellabanLevo == null) {
    							  					this.felso.setCellaElem(c);
    						  					  }
    						  					  break;
    						  case Lepes.LEFELE: if(this.also.cellabanLevo == null) {
				  									this.also.setCellaElem(c);
		  					  					 }	
		  					  					 break;
    						  case Lepes.BALRAFEL: if(this.balfelso.cellabanLevo == null) {
    							  						this.balfelso.setCellaElem(c);
    						  					   }
    						  					   break;
    						  case Lepes.BALRALE: if(this.balalso.cellabanLevo == null) {
    							  					this.balalso.setCellaElem(c);
    						  					  }
    						  					  break;
    						  case Lepes.JOBBRAFEL: if(this.jobbfelso.cellabanLevo == null) {
    							  						this.jobbfelso.setCellaElem(c);
    						  						}
    						  						break;
    						  case Lepes.JOBBRALE: if(this.jobbalso.cellabanLevo == null) {
    							  						this.jobbalso.setCellaElem(c);
    						  					   }
    						  					   break;
    						  }
    						  this.cellabanLevo.kovetkezoLepes = -1;
    						  break;
    		}
    	}
    	
    	Szkeleton.Finish("Cella", "Lekerdez");    	
    }
}
